package cn.colins.raft.task;

import cn.colins.raft.enity.RaftNodeInfo;
import cn.colins.raft.enums.NodeStatusEnums;
import cn.colins.raft.node.RaftNodeService;
import cn.colins.raft.state.StateMachines;

/**
 * @Description 心跳检测定时任务, 如果规定时间内没有心跳或者日志过来更新时间，我就上位候选人发起投票
 * @Author czl
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2023/7/18
 */
public class ElectionTask implements Runnable {

    private final long intervalTime;

    public ElectionTask(long checkInterval) {
        this.intervalTime = checkInterval;
    }

    @Override
    public void run() {
        long lastUpdateTime = RaftNodeInfo.getInstance().getLastUpdateTime();
        long now = System.currentTimeMillis();
        // 当前节点为follow 检测时间又超了 ： 说明我上位时机到了
        if (now - lastUpdateTime >= intervalTime && NodeStatusEnums.FOLLOW.equals(RaftNodeInfo.getInstance().getCurrentNodeStatus())) {
            // 变成为候选人 然后发起投票
            StateMachines.becomeCandidate();
            RaftNodeService.sendCallVote();
        }
    }
}
